Remove linked list elements

Time: O(N); Space: O(1); easy

Remove all elements from a linked list of integers that have value val.

Example 1:

Input: head = {ListNode} 1->2->6->3->4->5->6->None, val = 6

Output: {ListNode} 1->2->3->4->5->None

Example 2:

Input: head = {ListNode} 1->2->3->3->4->5->3->None, val = 3

Output: {ListNode} 1->2->4->5->None

Example 3:

Input: head = {ListNode} 1->1->None, val = 1

Output: None

[4]:
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None
[5]:
class Solution1(object):
    """
    Time: O(N)
    Space: O(1)
    """
    def removeElements(self, head, val):
        """
        :type head: ListNode
        :type val: int
        :rtype: ListNode
        """
        dummy = ListNode(float("-inf"))
        dummy.next = head
        prev, curr = dummy, dummy.next

        while curr:
            if curr.val == val:
                prev.next = curr.next
            else:
                prev = curr

            curr = curr.next

        return dummy.next
[7]:
s = Solution1()
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(6)
head.next.next.next = ListNode(3)
head.next.next.next.next = ListNode(4)
head.next.next.next.next.next = ListNode(5)
head.next.next.next.next.next.next = ListNode(6)
val = 6
res = s.removeElements(head, val)

exp = [1,2,3,4,5]
for val in exp:
    assert res.val == val
    res = res.next

head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(3)
head.next.next.next.next = ListNode(4)
head.next.next.next.next.next = ListNode(5)
head.next.next.next.next.next.next = ListNode(3)
val = 3
res = s.removeElements(head, val)

exp = [1,2,4,5]
for val in exp:
    assert res.val == val
    res = res.next

head = ListNode(1)
head.next = ListNode(1)
val = 1
res = s.removeElements(head, val)
assert res == None